package com.dmg.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * 数据源配置
 */
@Slf4j
@Configuration
public class DataSourceConfig {

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.url}")
    private String url;





    //配置默认数据源
    @Bean
    public DataSource dataSource() {
        log.info("配置默认数据源");
        MyDataSource myDataSource = new MyDataSource();
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("master", zhuDataSource());
        //设置目标数据源 把多个数据源放入到 resolvedDefaultDataSource 中
        myDataSource.setTargetDataSources(targetDataSources);
        //设置默认的数据源
        myDataSource.setDefaultTargetDataSource(zhuDataSource());
        return myDataSource;
    }

//    //优先注入这个bean 设置主库 数据源
//    @Primary
//    @Bean
//    public DataSource zhuDataSource() {
//        log.info("注入主库数据源的bean到ioc容器中");
//        DriverManagerDataSource ds = new DriverManagerDataSource();
//        ds.setUrl("jdbc:mysql://localhost:3306/zhu?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false");
//        ds.setUsername("root");
//        ds.setPassword("root");
//        //ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
//        return ds;
//    }

    //优先注入这个bean 设置主库 数据源
    @Primary
    @Bean
    public DataSource zhuDataSource() {
        log.info("注入主库数据源的bean到ioc容器中");
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        //ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return ds;
    }





    /**
     * 设置事务管理器 使得@Transactional 这个注解能够生效
     * 负责管理事务的创建,提交,回滚等操作
     * @return
     */
    @Bean
    public PlatformTransactionManager transactionManager(){
        log.info("把事务管理器注入ioc容器中");
        return new DataSourceTransactionManager(dataSource());
    }
}